/**
* @fileOverview 游戏源类源文件
* @author <a href="http://sivory.my.phpcloud.com">Sivory</a>
* @version 0
*/

/**
* @class 游戏源类。对一个游戏实例中的数据与逻辑的托管单元，主要功能为向内核提供游戏执行时所需的数据与脚本。
* @author <a href="http://sivory.my.phpcloud.com">Sivory</a>
* @version 0
*/
Name.Sivory.Opensea.Source=function()
{
	var instance=this; //引用当前实例
	
	/**
	* @private
	* @field
	* @description 被托管的XmlDocument对象
	* @type
	* @since 0.1
	*/
	this.dom=null
	
	/**
	* @public
	* @function
	* @description 根据给出的URL读取特定类型的XML文档，加载成功后执行回调函数。方法内部采用AJAX逻辑进行加载。
	* @param {String} url XML资源的路径
	* @param {String} type 服务器返回的具体资源类型，分“JSON”与“XML”。“XML”为纯XML文本格式；“JSON”为含有“data”域与“status”域的JSON格式文本，当其“status”域为1时，其“data”域须存放有XML文档。
	* @param {Function} [callback] 加载完毕执行的回调函数
	* @since 0.1
	*/
	this.load = function(url, type, callback)
	{
		var request=null;
		
		/*
		* 利用AJAX对象加载XML资源文件
		* 若AJAX对象不存在则采用微软的ActiveX控件
		*/
		if(window.XMLHttpRequest){ // For Mozilla, Safari, Chrome, ...
			request = new XMLHttpRequest();
		} else if(window.Activexobject){ // For Internet Explorer
			try {
				request = new Activexobject("Msxml2.XMLHTTP");
			} catch (e) {
				try {
					request = new Activexobject("Microsoft.XMLHTTP");
				} catch (e) {
					throw "在建立AJAX对象的时候发生异常(" + e + ")";
				}
			}
		}
		
		request.open("GET", url, true); //建立一个到url的GET异步请求
		
		/*
		* 在请求状态发生改变时执行托管函数
		* 只有当状态为4，响应为200时才是成功
		* 成功时需要取得XML文本，并将其转换为document对象
		* 内部会用到{@link OS_Document#parse}函数帮助解析
		*/
		request.onreadystatechange = function(){
			if (request.readyState == 4 && request.status == 200) //成功获得响应
			{
				//响应的XML文本
				var xmlText = null;
				
				//如果数据方式为xml，则取得其responseText字段作为XML文本
				if (type.toLowerCase() == "xml")
				{
					xmlText = request.responseText;
				} else if (type.toLowerCase() == "json")
				{
					try {
						var response = eval("(" + request.responseText + ")");
					} catch (e) {
						throw "在解析请求的JSON数据时发生异常";
					}
					if (response.status == 1) //服务器成功找到数据并返回
					{
						xmlText = response.data;
					}
					else
					{
						throw "服务器未能返回所请求的数据";
					}
				}
				
				//执行转换，将文本转换成为document对象
				instance.parse(xmlText);
				
				//调用回调函数
				if (!!callback)
				{
					callback();
				}
			}
			else if (request.readyState == 4 && request.status != 200)
			{
				throw "服务器返回错误代码";
			}
		}
		
		request.send(); //发送请求
	}
	
	/**
	* @public
	* @description 将指定的字符串转换为文档对象，存放于当前实例中。
	* @param {String} xmlString 存储有XML文档的字符串。
	* @since 0.1
	*/
	this.parse=function(xmlString)
	{
		try {
			if (!!window.DOMParser)
			{
				instance.dom = (new DOMParser).parseFromString(xmlString,"text/xml");
			}
			else if(!!window.ActiveXObject)
			{
				instance.dom = new ActiveXObject('Microsoft.XMLDOM');
				instance.dom.async = false;
				instance.dom.loadXml(xmlString);
			}
		} catch(e) {
			throw "解析XML文档时发生错误：" + e;
		}
		if (instance.dom.childNodes[0].nodeName != "resource")
		{
			throw "XML文档格式不正确";
		}
	}
	
	
}